Bit arthmetric(shift)

Shift arthmetric
    Logic shift
Logic shift(논리 쉬프트)에서 새롭게 나오는 비트는 언제나 0이다.
데이터로부터 쉬프트된 마지막 비트는 캐리 플래그에 저장된다.
mov ax,0C123H
shl ax,1 ;ax=8246H, CF=1
shr ax,1 ;ax=4123H, CF=0
shr ax,1 ;ax=2091H, CF=1
mov ax,0c123H
shl ax,2 ;ax=048CH, CF=1
mov cl,3
shr ax,cl ;ax=0091H, CF=1
unsigned shift에서만 logic shift를 통하여서 곱하기/나누기(2) 연산을 할 수 있다.
    Arithmetic shift
SAL과 SAR 명령어로 이루어져 있다.
SAL은 SHL과 정확히 같은 기계어 코드이다.
SAR은 피연산자의 부호비트를 쉬프트 하지 않는다. 부호비트는 쉬프트되기 전 부호비트와 같다.
mov ax,0C123H
sal ax,1 ;ax=8246H, CF=1
sal ax,1 ;ax=048CH, CF=1
sar ax,2 ;ax=0123H, CF=0
    Rotation shift
Rotation shift(회전 쉬프트)는 기본적으로 논리 쉬프트처럼 작동하지만,
쉬프트를 통해 사라진 끝 데이터가 새롭게 추가되는 데이터와 같다.
ROL, ROR이 있다.
마지막으로 쉬프트된 비트는 캐리 플리그에 저장된다.
mov ax,0C123H
rol ax,1 ;ax=8247H, CF=1
rol ax,1 ;ax=048FH, CF=1
rol ax,1 ;ax=091EH, CF=0
ror ax,2 ;ax=8247H, CF=1
ror ax,1 ;ax=C123H, CF=1
데이터의 비트와 캐리 플래그의 값을 함께 회전 시키는 명령어,
RCL, RCR도 있다.
mov ax,0C123H
clc ;clear the carry flag(CF=0)
rcl ax,1 ;ax=8246H, CF=1
rcl ax,1 ;ax=048DH, CF=1
rcl ax,1 ;ax=091BH, CF=0
rcr ax,2 ;ax=8246H, CF=1
rcr ax,1 ;ax=C123H, CF=0
Bit_Counter
EAX 레지스터에 켜져있는 비트의 숫자를 세는 소스(BL 레지스터에 저장)
mov bl,0
mov ecx,32 ;ecx
count_loop:
rol eax,1
jnc skip_inc ;if CF==0, skip_inc
inc bl
skip_inc:
loop count_loop